<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head>
  <title>Description of v_rotqrmean</title>
  <meta name="keywords" content="v_rotqrmean">
  <meta name="description" content="V_ROTQRMEAN calculates the mean rotation of a quaternion array [y,s]=[q]">
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  <meta name="generator" content="m2html &copy; 2003 Guillaume Flandin">
  <meta name="robots" content="index, follow">
  <link type="text/css" rel="stylesheet" href="../m2html.css">
</head>
<body>
<a name="_top"></a>
<div><a href="../index.html">Home</a> &gt;  <a href="index.html">v_mfiles</a> &gt; v_rotqrmean.m</div>

<!--<table width="100%"><tr><td align="left"><a href="../index.html"><img alt="<" border="0" src="../left.png">&nbsp;Master index</a></td>
<td align="right"><a href="index.html">Index for v_mfiles&nbsp;<img alt=">" border="0" src="../right.png"></a></td></tr></table>-->

<h1>v_rotqrmean
</h1>

<h2><a name="_name"></a>PURPOSE <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
<div class="box"><strong>V_ROTQRMEAN calculates the mean rotation of a quaternion array [y,s]=[q]</strong></div>

<h2><a name="_synopsis"></a>SYNOPSIS <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
<div class="box"><strong>function [y,s,v]=v_rotqrmean(q) </strong></div>

<h2><a name="_description"></a>DESCRIPTION <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
<div class="fragment"><pre class="comment">V_ROTQRMEAN calculates the mean rotation of a quaternion array [y,s]=[q]

 Inputs:   q(4,n)    normalized real quaternion array

 Outputs:  y(4,1)    normalized mean quaternion
           s(1,n)    sign vector such that y=q*s', y=y/sqrt(y.'*y)
           v         average squared deviation from the mean quaternion

 Since quaternions represent a rotation only to within a sign ambiguity
 we need to select +1 or -1 for each one when calculating the mean.
 This routine selects the sign for each quaternion to maximize the norm
 of their sum or, equivalently, to minimize their variance.

      Copyright (C) Mike Brookes 2011-2012
      Version: $Id: v_rotqrmean.m 10865 2018-09-21 17:22:45Z dmb $

   VOICEBOX is a MATLAB toolbox for speech processing.
   Home page: http://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/voicebox.html

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You can obtain a copy of the GNU General Public License from
   http://www.gnu.org/copyleft/gpl.html or by writing to
   Free Software Foundation, Inc.,675 Mass Ave, Cambridge, MA 02139, USA.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</pre></div>

<!-- crossreference -->
<h2><a name="_cross"></a>CROSS-REFERENCE INFORMATION <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
This function calls:
<ul style="list-style-image:url(../matlabicon.gif)">
</ul>
This function is called by:
<ul style="list-style-image:url(../matlabicon.gif)">
<li><a href="v_rectifyhomog.html" class="code" title="function [imr,xa,ya]=v_rectifyhomog(ims,roc,k0,mode)">v_rectifyhomog</a>	V_RECTIFYHOMOG Apply rectifying homographies to an image set</li></ul>
<!-- crossreference -->


<h2><a name="_source"></a>SOURCE CODE <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
<div class="fragment"><pre>0001 <a name="_sub0" href="#_subfunctions" class="code">function [y,s,v]=v_rotqrmean(q)</a>
0002 <span class="comment">%V_ROTQRMEAN calculates the mean rotation of a quaternion array [y,s]=[q]</span>
0003 <span class="comment">%</span>
0004 <span class="comment">% Inputs:   q(4,n)    normalized real quaternion array</span>
0005 <span class="comment">%</span>
0006 <span class="comment">% Outputs:  y(4,1)    normalized mean quaternion</span>
0007 <span class="comment">%           s(1,n)    sign vector such that y=q*s', y=y/sqrt(y.'*y)</span>
0008 <span class="comment">%           v         average squared deviation from the mean quaternion</span>
0009 <span class="comment">%</span>
0010 <span class="comment">% Since quaternions represent a rotation only to within a sign ambiguity</span>
0011 <span class="comment">% we need to select +1 or -1 for each one when calculating the mean.</span>
0012 <span class="comment">% This routine selects the sign for each quaternion to maximize the norm</span>
0013 <span class="comment">% of their sum or, equivalently, to minimize their variance.</span>
0014 <span class="comment">%</span>
0015 <span class="comment">%      Copyright (C) Mike Brookes 2011-2012</span>
0016 <span class="comment">%      Version: $Id: v_rotqrmean.m 10865 2018-09-21 17:22:45Z dmb $</span>
0017 <span class="comment">%</span>
0018 <span class="comment">%   VOICEBOX is a MATLAB toolbox for speech processing.</span>
0019 <span class="comment">%   Home page: http://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/voicebox.html</span>
0020 <span class="comment">%</span>
0021 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
0022 <span class="comment">%   This program is free software; you can redistribute it and/or modify</span>
0023 <span class="comment">%   it under the terms of the GNU General Public License as published by</span>
0024 <span class="comment">%   the Free Software Foundation; either version 2 of the License, or</span>
0025 <span class="comment">%   (at your option) any later version.</span>
0026 <span class="comment">%</span>
0027 <span class="comment">%   This program is distributed in the hope that it will be useful,</span>
0028 <span class="comment">%   but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
0029 <span class="comment">%   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span>
0030 <span class="comment">%   GNU General Public License for more details.</span>
0031 <span class="comment">%</span>
0032 <span class="comment">%   You can obtain a copy of the GNU General Public License from</span>
0033 <span class="comment">%   http://www.gnu.org/copyleft/gpl.html or by writing to</span>
0034 <span class="comment">%   Free Software Foundation, Inc.,675 Mass Ave, Cambridge, MA 02139, USA.</span>
0035 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
0036 mmax=10;                <span class="comment">% number of n-best hypotheses to keep</span>
0037 nq=size(q,2);
0038 mkx=zeros(nq,mmax);     <span class="comment">% save signs: 0=+, 1 = -</span>
0039 mprev=ones(nq,mmax);    <span class="comment">% save back pointers</span>
0040 msum=zeros(4,2*mmax);
0041 msum(:,1)=q(:,1);       <span class="comment">% current values of sum</span>
0042 ix=1:mmax;
0043 jx=mmax+1:2*mmax;
0044 r=ones(1,mmax);
0045 <span class="keyword">for</span> i=2:nq
0046     msum(:,jx)=msum(:,ix)-q(:,i(r));
0047     msum(:,ix)=msum(:,ix)+q(:,i(r));
0048     [vx,kx]=sort(sum(msum.^2,1),2,<span class="string">'descend'</span>);
0049     mkx(i,:)=kx(ix);    <span class="comment">% negative is &gt; mmax</span>
0050     msum(:,ix)=msum(:,kx(ix));  <span class="comment">% save mmax sums having highest norms</span>
0051 <span class="keyword">end</span>
0052 y=msum(:,1);            <span class="comment">% unnormalized mean</span>
0053 y=y/sqrt(y.'*y);
0054 <span class="keyword">if</span> nargout&gt;1            <span class="comment">% do traceback</span>
0055     s=zeros(1,nq);
0056     k=1;
0057     <span class="keyword">for</span> i=nq:-1:2
0058         s(i)=(mkx(i,k)&gt;mmax);
0059         k=mkx(i,k)-mmax*s(i);
0060     <span class="keyword">end</span>
0061     s=1-2*s;
0062     v=sum(mean((q-y*s).^2,2));
0063 <span class="keyword">end</span>
0064    
0065</pre></div>
<hr><address>Generated by <strong><a href="http://www.artefact.tk/software/matlab/m2html/">m2html</a></strong> &copy; 2003</address>
</body>
</html>